#include "server.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void handle_client(ServerInfo* server, int client_index) {
    Message msg;
    ClientInfo* client = &server->clients[client_index];

    while (1) {
        // 接收客户端发送的消息
        if (receive_message(client->socket, &msg) < 0) {
            perror("接收消息失败");
            break;
        }

        // 根据消息类型处理不同的请求
        switch (msg.type) {
            case MSG_TYPE_REGISTER: {
                // 处理注册请求
                char username[MAX_USERNAME_LEN], password[MAX_PASSWORD_LEN];
                // 这行代码使用 sscanf 函数从 msg.data 中解析用户名和密码
                // "%[^,]" 表示读取逗号之前的所有字符作为用户名
                // ",%s" 表示跳过逗号，然后读取剩余的所有字符作为密码
                // 解析后的用户名存储在 username 变量中，密码存储在 password 变量中
                
                // 可能会发生变动
                sscanf(msg.data, "%[^,],%s", username, password);
                handle_register(server, client_index, username, password);
                break;
            }
            case MSG_TYPE_LOGIN: {
                // 处理登录请求
                char username[MAX_USERNAME_LEN], password[MAX_PASSWORD_LEN];
                sscanf(msg.data, "%[^,],%s", username, password);
                handle_login(server, client_index, username, password);
                break;
            }
            case MSG_TYPE_CD:
                // 处理切换目录请求
                printf("%s\n", msg.data);
                handle_cd(server, client_index, msg.data);
                break;
            case MSG_TYPE_LS:
                // 处理列出目录内容请求
                handle_ls(server, client_index, msg.data);
                break;
            case MSG_TYPE_PWD:
                // 处理显示当前工作目录请求
                handle_pwd(server, client_index);
                break;
            case MSG_TYPE_MKDIR:
                // 处理创建目录请求
                handle_mkdir(server, client_index, msg.data);
                break;
            case MSG_TYPE_RM:
                // 处理删除文件或目录请求
                handle_rm(server, client_index, msg.data);
                break;
            case MSG_TYPE_PUTS:
                // 处理上传文件请求
                handle_puts(server, client_index, msg.data);
                break;
            case MSG_TYPE_GETS:
                // 处理下载文件请求
                handle_gets(server, client_index, msg.data);
                break;
            case MSG_TYPE_LOGOUT:
                // 处理登出请求
                client->is_logged_in = false;
                memset(client->username, 0, MAX_USERNAME_LEN);
                printf("用户已登出\n");
                return;
            default:
                // 处理未知的消息类型
                printf("未知的消息类型: %d\n", msg.type);
        }
    }
}